home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
SECURITY
/
0058.ZIP
/
CRYPT1.BAS
< prev
next >
Wrap
BASIC Source File
|
1984-04-14
|
15KB
|
265 lines
1000 ' PC-CRYP1.BAS
1010 ' WARNING!!! DO NOT ALTER, BYPASS OR REMOVE LINES 1000-1320
1020 CLS: CLEAR ,,512: KEY OFF: WIDTH 80: SCREEN 0,0,0: COLOR 7,0,0: LOCATE ,,0
1030 PRINT TAB(16) STRING$(15,45)" U S E R W A R E "STRING$(15,45)
1040 PRINT: PRINT TAB(28)"USER-SUPPORTED SOFTWARE": PRINT
1050 RESTORE 1060: FOR I.I%=1 TO 15: READ S.S$: PRINT SPC(8)S.S$: NEXT I.I%
1060 DATA" IF YOU USE THE PC-CRYP1 PROGRAM AND FIND IT OF VALUE,
1070 DATA" YOUR CONTRIBUTION ($5 SUGGESTED) WILL BE APPRECIATED.",""
1080 DATA" COPYRIGHT (C) 1984 BY JAMES T. DEMBERGER
1090 DATA" 7280 60TH AVENUE NORTH,
1100 DATA" ST. PETERSBURG, FL 33709
1110 DATA" 813-546-1182
1120 DATA" COMPUSERVE 74425,1642",""
1130 DATA"YOU ARE ENCOURAGED TO COPY AND SHARE THIS PROGRAM WITH OTHER USERS,
1140 DATA"ON THE CONDITIONS THAT THE PROGRAM IS NOT DISTRIBUTED IN MODIFIED
1150 DATA"FORM, THAT NO FEE OR CONSIDERATION IS CHARGED, AND THAT THIS NOTICE
1160 DATA"IS NOT BYPASSED OR REMOVED. COMMERCIAL USE OF THIS PROGRAM, IN
1170 DATA"WHOLE OR IN PART, OR DERIVATIVE VERSIONS OF THIS PROGRAM, IN WHOLE
1180 DATA"OR IN PART, IS PROHIBITED WITHOUT PERMISSION OF THE AUTHOR.
1190 GOSUB 1450: CLS: PRINT SPC(36)"PC-CRYP1": PRINT
1200 PRINT SPC(28)"VERSION 3.1 30 JAN 1984": PRINT
1210 FOR I.I%=1 TO 8: READ S.S$: PRINT SPC(10)S.S$: NEXT I.I%: PRINT
1220 DATA"PROGRAM DESCRIPTION AND RUN INSTRUCTIONS ARE ON DISKETTE WITH
1230 DATA"A FILENAME OF PC-CRYP1.DOC. A DISKETTE WITH THE BASIC PROGRAM
1240 DATA"PC-CRYP1.BAS, THE COMPILED PROGRAM PC-CRYP1.EXE AND THE DOCUMENTION
1250 DATA"FILE PC-CRYP1.DOC IS AVAILABLE FROM THE AUTHOR FOR $10.00.",""
1260 DATA"INTERPRETED BASIC HAS AN ENCRYPTION OR DECRYPTION THRUPUT OF
1270 DATA"APPROXIMATELY 12 CHARACTERS PER SECOND WHILE COMPILED BASIC
1280 DATA"HAS A THRUPUT OF MORE THAN 350 CHARACTERS PER SECOND.
1290 DIM C.S$(1): I.I%=VARPTR(C.S$(1))-VARPTR(C.S$(0))
1300 IF I.I%=4 THEN S.S$="COMPILED" ELSE S.S$="INTERPRETED"
1310 PRINT SPC(18)"PC-CRYP1 IS RUNNING AS ";S.S$;" BASIC.": GOSUB 1450: CLS
1320 ' MERGE ALL LINES FROM HERE THRU LINE READING "END OF MERGE STATEMENTS"
1330 ' INTO ANY PROGRAM USING SUBROUTINES FROM THIS PROGRAM
1340 ON ERROR GOTO 1510: DIM C.LST%(103),T.REC$(10): TRU.ON%=-1: FAL.OF%=0
1350 CTR.SET$="*C_T_R R_E_S_E_T*": GOSUB 2140: GOTO 1700
1360 PRINT SPC(15)"USE LOWER CASE TO UPPER CASE CONVERT? Y/N ";: GOSUB 1460
1370 U.C%=FAL.OF%: IF N.N%=89 THEN U.C%=TRU.ON%: RETURN ELSE RETURN
1380 PRINT SPC(15)"USE SPACE TO ^(94) & ~(126) CONVERT? Y/N ";: GOSUB 1460
1390 S.C%=TRU.ON%: IF N.N%=78 THEN S.C%=FAL.OF%: RETURN ELSE RETURN
1400 LOCATE 25,26: PRINT"PRESS ESC TO RETURN TO MENU";: LOCATE I.ROW%,1: RETURN
1410 FOR I.I%=1 TO LEN(STR.IN$): J.J%=ASC(MID$(STR.IN$,I.I%,1))
1420 IF J.J%>96 AND J.J%<123 THEN J.J%=J.J%-32: MID$(STR.IN$,I.I%,1)=CHR$(J.J%)
1430 NEXT I.I%: RETURN
1440 PRINT SPC(25)"SET PAPER TO TOP-OF-PAGE"
1450 PRINT: PRINT SPC(25)"PRESS ANY KEY TO CONTINUE ";
1460 DEF SEG=0: POKE 1050,PEEK(1052): DEF SEG: POKE 106,0: COLOR 23,0: BEEP
1470 PRINT"_";: LOCATE ,POS(0)-1: COLOR 7,0: S.TR$=INPUT$(1): N.N%=ASC(S.TR$)
1480 I.E%=0: IF N.N%<123 AND N.N%>96 THEN N.N%=N.N% XOR 32
1490 IF N.N%=27 THEN I.E%=-1: N.N%=32 ELSE IF N.N%<32 THEN N.N%=32
1500 S.TR$=CHR$(N.N%): PRINT S.TR$: PRINT: RETURN
1510 CLOSE: IF ERL=3060 THEN GOSUB 1560: RESUME 3040
1520 IF ERL=3090 THEN GOSUB 1560: RESUME 3070
1530 PRINT: PRINT SPC(25)"ERROR ";ERR;" AT LINE ";ERL: RESUME 1540
1540 PRINT: PRINT SPC(25)"WANT TO CONTINUE OR END PROGRAM? C/E ";: GOSUB 1460
1550 IF S.TR$="C" THEN 1720 ELSE 1830
1560 PRINT: PRINT SPC(25)"FILE NOT FOUND OR BAD FILE NAME": RETURN
1570 I.COLH%=POS(0): STR.IN$=""
1580 COLOR 23,0: PRINT"_";: COLOR 7,0
1590 CHR.IN$=INKEY$: IF CHR.IN$="" THEN 1590 ELSE CHR.IN%=ASC(CHR.IN$)
1600 LOCATE ,POS(0)-1: IF CHR.IN%>31 THEN PRINT CHR.IN$;: GOTO 1630
1610 IF CHR.IN%=8 THEN 1640 ELSE IF CHR.IN%=13 OR CHR.IN%=27 THEN 1670
1620 IF CHR.IN%=7 THEN PRINT CHR$(126);: GOTO 1630 ELSE PRINT" ";
1630 STR.IN$=STR.IN$+CHR.IN$: IF LEN(STR.IN$)>=78 THEN 1670 ELSE 1580
1640 IF LEN(STR.IN$)<1 THEN LOCATE ,I.COLH%: GOTO 1580
1650 LOCATE ,POS(0)-1: PRINT" ";: LOCATE ,POS(0)-2
1660 STR.IN$=LEFT$(STR.IN$,LEN(STR.IN$)-1): GOTO 1580
1670 PRINT" ": LOCATE CSRLIN,1: RETURN
1680 PRINT"ENTER RECORD ";L.L%;
1690 PRINT"- MAXIMUM 78 CHARS - PRESS ESC TO END KEYBOARD INPUT": BEEP: RETURN
1700 CLS
1710 ' END OF MERGE STATEMENTS
1720 CLS: IF TIM.SW% THEN GOSUB 2540
1730 PRINT: PRINT SPC(34)"PC-CRYP1 MENU": PRINT
1740 PRINT SPC(26)"P SELECT A NEW PASSWORD"
1750 PRINT SPC(26)"F PROCESS DISKETTE FILES"
1760 PRINT SPC(26)"S ENCRYPT & DECRYPT TEST STRINGS"
1770 PRINT SPC(26)"T TURN TIMER OFF/ON"
1780 PRINT SPC(26)"X EXIT/END PROGRAM"
1790 PRINT: PRINT SPC(30)"ENTER OPTION LETTER ";
1800 GOSUB 1460: OPT.SEL%=INSTR("SFPTXM",S.TR$)
1810 ON OPT.SEL% GOSUB 2610,3030,2140,2550,1830,1840
1820 GOTO 1720
1830 CLS: PRINT SPC(35)"END PC-CRYP1": END
1840 PRINT SPC(35)"FREE=";FRE(""): GOSUB 1450: RETURN
1850 ' ENCRYPT/DECRYPT SUBROUTINE
1860 ' NOTE: CTR.SET% MUST BE SET = 1 FOR FIRST STRING TO BE EN/DECRYPT
1870 ' INPUT: ED.IN$=[CHARACTER STRING TO BE EN/DECRYPT]
1880 ' OUTPUT: ED.OUT$=[EN/DECRYPT CHARACTER STRING]
1890 ' SUBROUTINE USES VALUES IN ARRAY C.LST%(CTR.[1,2,3]%)
1900 ED.SW%=TRU.ON% 'ENTRY LINE FOR ENCRYPTION
1910 ED.OUT$="": ON CTR.SET%+1 GOTO 1930,2080 'ENTRY LINE FOR DECRYPTION
1920 PRINT"CTR.SET% NOT 0 OR 1": GOSUB 1450: GOTO 1720
1930 FOR I.I%=1 TO LEN(ED.IN$): CHR.COD%=ASC(MID$(ED.IN$,I.I%,1))
1940 IF CHR.COD%=7 THEN 2090 ELSE IF CHR.COD%<32 THEN 2060
1950 IF ESC.COD% THEN 2060 ELSE IF NOT ED.SW% THEN 2000
1960 IF CHR.COD%=32 THEN IF S.C% THEN 1980 ELSE 2000
1970 IF U.C% THEN 1990 ELSE 2000
1980 IF LST.CHR%<96 THEN CHR.COD%=94 ELSE CHR.COD%=126: GOTO 2000
1990 IF CHR.COD%<97 OR CHR.COD%>122 THEN 2000 ELSE CHR.COD%=CHR.COD% XOR 32
2000 CHR.COD%=CHR.COD% XOR C.LST%(CTR.1%) XOR C.LST%(CTR.2%) XOR C.LST%(CTR.3%)
2010 CTR.1%=CTR.1%+1: IF CTR.1%>97 THEN CTR.1%=1
2020 CTR.2%=CTR.2%+1: IF CTR.2%>101 THEN CTR.2%=1
2030 CTR.3%=CTR.3%+1: IF CTR.3%>103 THEN CTR.3%=1
2040 IF ED.SW% THEN 2060
2050 IF S.C% THEN IF CHR.COD%=94 OR CHR.COD%=126 THEN CHR.COD%=32
2060 ED.OUT$=ED.OUT$+CHR$(CHR.COD%): LST.CHR%=CHR.COD%
2070 NEXT I.I%: ED.SW%=0: RETURN
2080 CTR.1%=CTRH.1%: CTR.2%=CTRH.2%: CTR.3%=CTRH.3%: CTR.SET%=0: GOTO 1930
2090 IF ESC.COD% THEN ESC.COD%=FAL.OF%: GOTO 2060
2100 ESC.COD%=TRU.ON%: GOTO 2060
2110 ' SELECT NEW PASSWORD
2120 ' INPUT: PASSWORD
2130 ' OUTPUT: CODE VALUES IN C.LST% ARRAY
2140 CLS: PRINT SPC(30)"SELECT NEW PASSWORD": PRINT
2150 PRINT SPC(18)"PRESS V FOR A VISIBLE DISPLAY OF PASSWORD OR"
2160 PRINT SPC(22)"PRESS ENTER FOR NON-VISIBLE DISPLAY ";
2170 GOSUB 1460: IF N.N%=86 THEN F.G%=7 ELSE F.G%=0: PRINT
2180 PRINT SPC(25)"OLD PASSWORD IS ";: COLOR F.G%: PRINT P.WD$: COLOR 7
2190 PRINT: PRINT SPC(25)"ENTER NEW PASSWORD ";: COLOR F.G%
2200 LINE INPUT P.WX$: COLOR 7: IF P.WX$="" AND P.WD$="" THEN 2190
2210 PRINT: IF P.WX$="" AND LEN(P.WD$)>0 THEN 2350 ELSE P.WD$=P.WX$
2220 IF LEN(P.WX$)<11 THEN P.WX$=P.WX$+P.WX$: GOTO 2220
2230 FOR I.I%=1 TO 11: C.LST%(I.I%)=(ASC(MID$(P.WX$,I.I%,1))-8) MOD 10
2240 NEXT I.I%: R.G#=0
2250 FOR I.I%=1 TO 5: R.G#=R.G#+C.LST%(I.I%)*(10^(5-I.I%)): NEXT I.I%
2260 IF R.G#>32767 THEN R.G#=R.G#-10000: GOTO 2260
2270 CTRH.1%=C.LST%(6)*10+C.LST%(7)
2280 CTRH.2%=C.LST%(8)*10+C.LST%(9): CTRH.3%=C.LST%(10)*10+C.LST%(11)
2290 PRINT SPC(25)"CODE LIST FOR PASSWORD ";: COLOR F.G%: PRINT P.WD$: COLOR 7
2300 PRINT: FOR M.M%=1 TO 103
2310 R.G#=(R.G#*997)+32771!: R.G#=R.G#-(INT(R.G#/32768!)*32768!)
2320 I.I%=FIX(R.G#/10) MOD 32: C.LST%(M.M%)=I.I%: PRINT USING"##";I.I%;
2330 IF M.M%=103 THEN 2350 ELSE IF M.M% MOD 26 THEN PRINT","; ELSE PRINT
2340 NEXT M.M%
2350 PRINT: GOSUB 1450: RETURN
2360 ' TIMER SUBROUTINE
2370 TIM.SE%=TRU.ON% 'ENTRY LINE FOR START, NEXT LINE ENTRY LINE FOR END TIME
2380 DEF SEG=64: T.H#=PEEK(110): T.M#=PEEK(109): T.S#=PEEK(108): DEF SEG
2390 T.R#=(T.H#*65536!)+(T.M#*256)+T.S#
2400 ' REM 2 PRECEEDING LINES AND DE-REM NEXT LINE IF CLOCK CAN NOT BE PEEKED
2410 'T.R#=VAL(MID$(TIME$,1,2))*3600+VAL(MID$(TIME$,4,2))*60+VAL(MID$(TIME$,7,2))
2420 IF NOT TIM.SE% THEN 2440
2430 TIM.SE%=FAL.OF%: T.X#=T.R#: RETURN
2440 T.T#=T.T#+T.R#-T.X#: RETURN
2450 T.T#=T.T#*.0549255+.001 'ENTRY LINE DISPLAY ACCUMULATED TIME
2460 ' REM PRECEEDING LINE AND DE-REM FOLLOWING LINE IF CLOCK CAN NOT BE PEEKED
2470 'IF T.T#=<1 THEN T.T#=.1 'ENTRY LINE DISPLAY ACCUMULATED TIME
2480 T.H#=FIX(T.T#/3600): T.S#=T.T#-T.H#*3600
2490 T.M#=FIX(T.S#/60): T.S#=T.S#-T.M#*60
2500 PRINT: PRINT USING"TOTAL TIME ## HOURS ## MINUTES ";T.H#;T.M#;
2510 PRINT USING"##.### SECONDS";T.S#
2520 PRINT USING"TOTAL CHARACTERS ###,### ";NO.CHAR!;
2530 PRINT USING"CHARACTERS PER SECOND ####.##"; NO.CHAR!/T.T#
2540 NO.CHAR!=0: T.T#=0: RETURN
2550 PRINT SPC(34)"TIMER IS ";
2560 IF TIM.SW% THEN PRINT"ON" ELSE PRINT"OFF"
2570 PRINT: PRINT SPC(14)"PRESS O FOR TIMER ON - PRESS F FOR TIMER OFF - O/F ";
2580 GOSUB 1460: IF N.N%=79 THEN TIM.SW%=TRU.ON% ELSE TIM.SW%=FAL.OF%
2590 RETURN
2600 ' TEST STRINGS
2610 CLS: PRINT SPC(25)"ENCRYPT & DECRYPT TEST STRINGS": S.TR$=" STRING OF "
2620 PRINT: PRINT SPC(20)"A"+S.TR$+"CHARACTERS WITH ASCII CODES 32 TO 127"
2630 PRINT SPC(20)"B"+S.TR$+"CHARACTERS WITH ASCII CODES 0 TO 127"
2640 PRINT SPC(20)"C"+S.TR$+"100 CHARACTER _"
2650 PRINT SPC(20)"D"+S.TR$+"CHARACTERS ENTERED FROM KEYBOARD": PRINT
2660 PRINT SPC(26)"PRESS ESC TO RETURN TO MENU"
2670 PRINT: PRINT SPC(30)"ENTER OPTION LETTER ";: GOSUB 1460: IF I.E% THEN 2710
2680 NO.REC%=10: OPT.SEL%=INSTR("ABCD",S.TR$): IF OPT.SEL%=0 THEN 2610
2690 GOSUB 1360: IF I.E% THEN 2710
2700 GOSUB 1380: IF I.E% THEN 2710 ELSE ON OPT.SEL% GOTO 2740,2740,2720,2760
2710 RETURN
2720 PRINT SPC(30)"ENTER CHARACTER ";: GOSUB 1460: IF I.E% THEN 2710
2730 CHR.IN$=S.TR$
2740 PRINT SPC(15)"NUMBER OF RECORDS TO ENCRYPT - 10 OR LESS ";: BEEP
2750 INPUT"",S.TR$: NO.REC%=VAL(S.TR$): IF NO.REC%<1 OR NO.REC%>10 THEN 2740
2760 CLS: FOR L.L%=1 TO NO.REC%: ON OPT.SEL% GOTO 2820,2820,2810,2770
2770 GOSUB 1680: T.REC$(L.L%)="": GOSUB 1570: T.REC$(L.L%)=STR.IN$: GOSUB 2790
2780 IF CHR.IN%=27 THEN NO.REC%=L.L%-1: GOTO 2900 ELSE 2870
2790 LOCATE CSRLIN-2,1: PRINT SPACE$(79): PRINT SPACE$(79)
2800 LOCATE CSRLIN-2,1: RETURN
2810 T.REC$(L.L%)=STRING$(100,CHR.IN$): GOTO 2870
2820 IF OPT.SEL%=1 THEN J.J%=32 ELSE J.J%=0
2830 T.REC$(L.L%)="": FOR K.K%=J.J% TO 127
2840 T.REC$(L.L%)=T.REC$(L.L%)+CHR$(K.K%)
2850 IF K.K%=7 THEN T.REC$(L.L%)=T.REC$(L.L%)+CHR$(K.K%)
2860 NEXT K.K%
2870 PRINT USING"REC NO ## CLEAR TEXT";L.L%: PRINT T.REC$(L.L%)
2880 NEXT L.L%
2890 ' DISPLAY ROUTINE
2900 CTR.SET%=1: FOR L.L%=1 TO NO.REC%
2910 PRINT USING"REC NO ## ENCRYPT TEXT";L.L%
2920 ED.IN$=T.REC$(L.L%): IF TIM.SW% THEN GOSUB 2370
2930 GOSUB 1900: IF TIM.SW% THEN GOSUB 2380
2940 T.REC$(L.L%)=ED.OUT$: PRINT T.REC$(L.L%): NEXT L.L%
2950 CTR.SET%=1: FOR L.L%=1 TO NO.REC%
2960 PRINT USING"REC NO ## DECRYPT TEXT";L.L%
2970 IF NOT TIM.SW% THEN 2990
2980 NO.CHAR!=NO.CHAR!+LEN(T.REC$(L.L%))*2: GOSUB 2370
2990 ED.IN$=T.REC$(L.L%): GOSUB 1910: IF TIM.SW% THEN GOSUB 2380
3000 PRINT ED.OUT$: NEXT L.L%: IF TIM.SW% THEN GOSUB 2450
3010 GOSUB 1450: CLS: GOTO 2610
3020 ' PROCESS FILES
3030 CLS: PRINT SPC(33)"PROCESS FILES": I.ROW%=CSRLIN: GOSUB 1400
3040 PRINT: PRINT SPC(15)"ENTER INPUT DR:FILENAME.EXT OR KEYBD ";: BEEP
3050 GOSUB 1570: IF CHR.IN%=27 THEN 3200 ELSE GOSUB 1410
3060 FIL.IN$=STR.IN$: IF FIL.IN$="KEYBD" THEN 3070 ELSE OPEN "I",1,FIL.IN$
3070 PRINT: PRINT SPC(15)"ENTER OUTPUT DR:FILENAME.EXT OR NOFILE ";: BEEP
3080 GOSUB 1570: IF CHR.IN%=27 THEN 3200 ELSE GOSUB 1410
3090 FIL.OUT$=STR.IN$: IF FIL.OUT$="NOFILE" THEN 3100 ELSE OPEN "O",2,FIL.OUT$
3100 PRINT: PRINT SPC(25)"ENCRYPT OR DECRYPT? E/D ";: GOSUB 1460
3110 OPT.SEL%=N.N%-67: IF OPT.SEL%=1 OR OPT.SEL%=2 THEN 3130
3120 IF I.E% THEN 3200 ELSE 3100
3130 IF OPT.SEL%=1 THEN 3140 ELSE GOSUB 1360: IF I.E% THEN 3200
3140 GOSUB 1380: IF I.E% THEN 3200
3150 PRINT SPC(25)"PRINT INPUT TEXT? Y/N ";: GOSUB 1460: IF I.E% THEN 3200
3160 IF N.N%=89 THEN PRT.I%=TRU.ON% ELSE PRT.I%=FAL.OF%
3170 PRINT SPC(25)"PRINT OUTPUT TEXT? Y/N ";: GOSUB 1460: IF I.E% THEN 3200
3180 IF N.N%=89 THEN PRT.O%=TRU.ON% ELSE PRT.O%=FAL.OF%
3190 GOTO 3250
3200 IF TIM.SW% THEN GOSUB 2540
3210 PRINT
3220 PRINT SPC(12)"PRESS ESC TO RETURN TO MENU OR C KEY TO CHANGE OPTIONS ";
3230 GOSUB 1460: IF I.E% THEN RETURN ELSE 3030
3240 ' PRINT ROUTINE
3250 IF PRT.I% OR PRT.O% THEN GOSUB 1440: GOSUB 3540
3260 CLS: IF FIL.IN$="KEYBD" THEN 3280 ELSE LOCATE 25,20
3270 PRINT"PRESS ESC TO END PRINT & RETURN TO MENU";
3280 LOCATE 1,1: LN.PRT%=0: I.PG%=0: CTR.SET%=1: L.L%=0
3290 IF FIL.IN$="KEYBD" THEN 3300 ELSE IF EOF(1) THEN 3560 ELSE 3320
3300 L.L%=L.L%+1: GOSUB 1680
3310 GOSUB 1570: IF CHR.IN%=27 THEN 3560 ELSE ED.IN$=STR.IN$: GOTO 3330
3320 LINE INPUT #1,ED.IN$
3330 LEN.STR%=LEN(ED.IN$): LN.W%=(LEN.STR%-1)\80+1
3340 IF ED.IN$=CTR.SET$ THEN CTR.SET%=1: ED.OUT$=ED.IN$: GOTO 3440
3350 ' NEXT 5 LINES SUBSTITUTE CHR$(126) FOR CHR$(127) & (7) WHEN LPRINT
3360 S.TR$=ED.IN$: K.K%=1
3370 FOR J.J%=1 TO 2: IF J.J%=1 THEN CHR.IN%=7 ELSE CHR.IN%=127
3380 I.I%=INSTR(K.K%,S.TR$,CHR$(CHR.IN%)): IF I.I%=0 THEN 3400
3390 MID$(S.TR$,I.I%,1)=CHR$(126): K.K%=I.I%: GOTO 3380
3400 NEXT J.J%: IF PRT.I% THEN LPRINT S.TR$: LN.PRT%=LN.PRT%+LN.W%
3410 IF FIL.IN$<>"KEYBD" THEN PRINT S.TR$
3420 IF TIM.SW% THEN NO.CHAR!=NO.CHAR!+LEN.STR%: GOSUB 2370
3430 ON OPT.SEL% GOSUB 1910,1900: IF TIM.SW% THEN GOSUB 2380
3440 IF FIL.OUT$="NOFILE" THEN 3460 ELSE PRINT #2,ED.OUT$
3450 ' NEXT 4 LINES SUBSTITUTE CHR$(126) FOR CHR$(127) & (7) FOR LPRINT
3460 K.K%=1: FOR J.J%=1 TO 2: IF J.J%=1 THEN CHR.IN%=7 ELSE CHR.IN%=127
3470 I.I%=INSTR(K.K%,ED.OUT$,CHR$(CHR.IN%)): IF I.I%=0 THEN 3490
3480 MID$(ED.OUT$,I.I%,1)=CHR$(126): K.K%=I.I%: GOTO 3470
3490 NEXT J.J%: IF PRT.O% THEN LPRINT ED.OUT$: LN.PRT%=LN.PRT%+LN.W%
3500 PRINT ED.OUT$: IF LN.PRT%>=54 THEN GOSUB 3530
3510 S.TR$=INKEY$: IF S.TR$="" THEN 3290
3520 IF ASC(S.TR$)=27 THEN 3580 ELSE 3290
3530 LPRINT CHR$(12);
3540 LPRINT"IN=";FIL.IN$;TAB(20)"OUT=";FIL.OUT$;TAB(40);DATE$;" ";TIME$;
3550 I.PG%=I.PG%+1: LPRINT TAB(70)"PAGE";I.PG%: LPRINT"": LN.PRT%=0: RETURN
3560 IF ED.OUT$=CTR.SET$ THEN 3580
3570 IF OPT.SEL%=2 AND FIL.OUT$<>"NOFILE" THEN PRINT #2,CTR.SET$
3580 IF TIM.SW% THEN GOSUB 2450
3590 CLOSE: GOSUB 1450: IF PRT.I% OR PRT.O% THEN 3600 ELSE 3030
3600 PRINT: PRINT SPC(25)"SKIP TO TOP OF PAGE? Y/N ";: GOSUB 1460
3610 IF S.TR$="Y" THEN LPRINT CHR$(12)
3620 GOTO 3030
3630 ' LAST LINE PC-CRYP1